"""
原理：
    幻影坦克在黑色背景下每个像素应为r1
    因此有r*alpha=r1（黑色背景下原色调r*alpha得出新色）
    
    在白色背景下有：r2 = 255(1 - alpha) + aplha * r
    
    两张图像在都能映射到同一幅图像上，而根据透明度计算公式的不同计算方法
    幻影图像有不同的取值（表现为不同的图像）
    
    联立方程求解：
        alpha = (r1 - r2) / 255 + 1
        r = r1 / alpha
          = r1 / ((r1 - r2) / 255 + 1) （alpha≠0）
    这里有限制条件，r1-r2必须<0 
    因此需要对r1和r2进行约束处理
    对r1：r1* = r1/2 （从0-255映射为0-127）
    对r2：r2* =r2/2 +128 （从0-255映射到128- 255）
    至此，r1-r2恒小于0，无论如何都能叠加成功
 
程序步骤:
    1.导入a，b两图
    2.假设a是内部显色（r1黑色背景），b是外部显色（r2白色背景）
    3.a的每个像素作为r1
    4.b的每个像素颜色作为r2
    6.对r1 r2进行限制处理
    5.联立r1和r2：
    黑色rgb：0 0 0 白色rgb 255 255 255
    r1 = alpha * r （黑色）
    r2 = 255(1 - alpha) + aplha * r （白色）
    求得r和alpha
    6.由r和alpha组成新图像
"""
import json
from PIL import Image
import numpy as np
import os
from datetime import datetime

def calculate_alpha_r(r1, r2):
    """
    根据 r1 和 r2 计算 alpha 和 r
    """
    r1 = r1.astype(np.int32)
    r2 = r2.astype(np.int32)
    if ((r1 > r2).any()):
        print(r1)
        print(r2)
    alpha = (r1 - r2) / 255 + 1
    r = r1 / alpha if alpha != 0 else 0  # 处理 alpha=0 的情况
    return alpha, r

def generate_phantom_image(config):
    """
    生成幻影图
    :param config: 配置字典，包含输入和输出路径
    """
    # 构建输入文件路径
    inner_path = os.path.join(config["input_folder"], "inner", config["inner_filename"])
    outter_path = os.path.join(config["input_folder"], "outer", config["outter_filename"])

    # 确保输出文件夹存在
    output_folder = config["output_folder"]
    os.makedirs(output_folder, exist_ok=True)

    # 自动生成输出文件名
    timestamp = datetime.now().strftime("%Y%m%d%H%M%S")
    output_filename = f"phantom_{timestamp}.png"
    output_path = os.path.join(output_folder, output_filename)

    # 1. 导入图像
    inner = Image.open(inner_path).convert("L")
    inner = inner.convert("RGB")
    outter = Image.open(outter_path).convert("L")
    outter = outter.convert("RGB")
    # 确保为 RGB 模式

    # 2. 调整 r1 的尺寸（缩放至 r2 的尺寸）
    inner = inner.resize(outter.size, Image.Resampling.LANCZOS)  # 使用高质量缩放算法

    # 3. 转换为 numpy 数组
    inner_array = np.array(inner)
    outter_array = np.array(outter)

    # 4. 创建空白图像存储结果
    result_array = np.zeros((inner_array.shape[0], inner_array.shape[1], 4), dtype=np.uint8)

    # 5. 遍历每个像素
    for y in range(inner_array.shape[0]):
        for x in range(inner_array.shape[1]):
            # 获取 r1 和 r2（RGB 三个通道分别处理）
            r1 = inner_array[y, x]
            r2 = outter_array[y, x]
            r1 = r1 // 2
            r2 = r2 // 2 + 128
            # 对每个通道计算 alpha 和 r
            alpha_r = [calculate_alpha_r(r1[i], r2[i]) for i in range(3)]
            alpha = np.mean([ar[0] for ar in alpha_r])  # 取三个通道 alpha 的平均值
            r = [int(ar[1]) for ar in alpha_r]  # 取三个通道的 r 值

            # 将结果写入新图像
            result_array[y, x] = [r[0], r[1], r[2], int(alpha * 255)]

    # 6. 保存结果图像
    result_image = Image.fromarray(result_array)
    result_image.save(output_path)
    print(f"幻影图已保存至：{output_path}")

def load_config(config_path):
    """
    加载配置文件
    :param config_path: 配置文件路径
    :return: 配置字典
    """
    with open(config_path, "r") as f:
        config = json.load(f)
    return config

if __name__ == "__main__":
    # 加载配置文件
    config = load_config("config.json")
    # 生成幻影图
    generate_phantom_image(config)